home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / cc02.zip / CDEBUG.C < prev    next >
Text File  |  1984-06-13  |  4KB  |  119 lines

  1.  
  2. /*
  3.  *      If you wish to use these macros copy them from [11,1]debug.h
  4.  *
  5.  */
  6.  
  7. /* debug.h - This contains the definition of the debugging macros denter,
  8.  *      debug, and dleave.  In order to invoke the macros the preprocessor
  9.  *      symbol DEBUG must be defined.  If the symbol DEBUG is not defined the
  10.  *      macros are translated to the NULL statement ';'.  Once your debugging
  11.  *      statements are in place, they do not have to be commented out, or
  12.  *      deleted from your program in order to suppress the debugging output.
  13.  *
  14.  * Note one of the modules of your program must have the preprocessor symbol
  15.  *      MAIN defined.  Logically this dictates the module containing the
  16.  *      main() will be the one defining this symbol.  The debugging package
  17.  *      sets up the GLOBAL symbols D_S and D_I.  D_S is the the string of
  18.  *      blanks that the indents are taken from, and D_I is the current
  19.  *      indentation level.
  20.  *
  21.  * Debugging output is directed to the pseudo file descriptor STDBUG.  The user
  22.  *      should direct any of their own debugging output to this file using:
  23.  *
  24.  *              fprintf (STDBUG, fmt, args);
  25.  *
  26.  *      where the fmt is a valid printf family format string, and args is a
  27.  *      list of arguements satisfying the fmt string.  The user can define
  28.  *      STDERR to any fd, and the debugging output will be redirected to that
  29.  *      file.
  30.  *
  31.  *      The denter, debug, and dleave are used as follows:
  32.  *
  33.  *      denter(str);
  34.  *              This will display a message indented two more spaces than what
  35.  *      currently indented.  When used with dleave, this macro provides a
  36.  *      useful means of tracing the nesting of loops and functions.
  37.  *
  38.  *      debug(x);
  39.  *
  40.  *              This will ensure that indentation is correct and excute the
  41.  *      function x only when DEBUG is defined.  The most comman usage is with
  42.  *      the function fprintf as:
  43.  *
  44.  *              debug(fprintf(DEBUG,"%x=%d, y=%d\n", x, y));
  45.  *
  46.  *      dleave(str);
  47.  *
  48.  *              This will display a message undented two more spaces than what
  49.  *      it is currently indented.  The dleave call will have no effect it is
  50.  *      up against the left margin
  51.  *
  52.  *
  53.  *      indent();
  54.  *
  55.  *              This will cause the debug output to be indented two more than
  56.  *      it is already.
  57.  *
  58.  *      undent();
  59.  *              This will cause the debug output to be undented two more than
  60.  *      it is already.
  61.  *
  62.  */
  63.  
  64.  
  65. #ifndef STDBUG
  66. #define STDBUG  STDERR
  67. #endif
  68. /* The preprocessor symbol MAIN must be defined in only one of the modules that
  69.  *      wish to use the debugging macros.  It causes the global variables D_I
  70.  *      and D_S to be properly initialized.  If MAIN is not defined then the
  71.  *      proper external reference to these variables is set.
  72.  */
  73.  
  74. #define D_L 70
  75.  
  76. #ifdef MAIN
  77.  
  78. extern int  D_I = 0;
  79.  
  80. extern char D_S[] =
  81. /*1234567890123456789012345678901234567890123456789012345678901234567890*/
  82.  "                                                                      ";
  83.  
  84. #else
  85.  
  86. extern int D_I;
  87. extern char D_S[];
  88. #endif
  89.  
  90. #ifdef DEBUG
  91.  
  92. #define indent()        (D_I < 35 ? D_I++ : D_I)
  93. #define undent()        (D_I > 0  ? --D_I : D_I)
  94. #define INS_INDENT      fprintf(STDBUG, "%s", &D_S[D_L - indent()*2])
  95. #define DEL_INDENT      fprintf(STDBUG, "%s", &D_S[D_L - undent()*2])
  96. #define INDENT fprintf(STDBUG, "%s", &D_S[D_L-D_I*2])
  97. #define denter(x) (INS_INDENT, fprintf(STDBUG, "entering: %s\n", x))
  98. #define debug(x) (INDENT, x)
  99. #define dleave(x) (DEL_INDENT, fprintf(STDBUG, "leaving:  %s\n", x))
  100.  
  101.  
  102. /*      If DEBUG is not defined then replace the 'calls' to the debugging
  103.  *      macros by null expressions. ie. ';'.
  104.  */
  105.  
  106. #else
  107. #define denter(x) ;
  108. #define debug(x) ;
  109. #define dleave(x) ;
  110. #define indent() ;
  111. #define undent() ;
  112. #endif
  113. .
  114.  */
  115.  
  116. #else
  117. #define denter(x) ;
  118. #define debug(x) ;
  119. #define dleave(x) ;